/**
 * Created with IntelliJ IDEA.
 * Description: leetcode: 162. 寻找峰值
 * <a href="https://leetcode.cn/problems/find-peak-element/">...</a>
 * User: DELL
 * Date: 2023-10-24
 * Time: 22:12
 */
public class Solution {
    /**
     * 解题思路: (二分)
     * 本题是借鉴二分的思想,即预先定义三个值,left,right,mid,其中
     * mid = (left+right)/2 ,那么若 nums[mid] 满足条件,则直接
     * 返回,而若 nums[mid] 不满足条件,则可以判断如下:
     * 1) nums[mid] > nums[mid+1]: 则[left,mid-1]中一定有一个峰值,即直接舍弃右边即可
     * 2) nums[mid] < nums[mid+1]: 则[mid+1,right]中一定有一个峰值,直接舍弃左边即可
     * 3) 依据提议,不可能是 nums[mid] = nums[mid+1]
     * 因此使用二分的思想就可以很快速的找到一个峰值,其中要注意的就是不要越界即可.
     *
     * @param nums
     * @return
     */
    public int findPeakElement(int[] nums) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        int mid = (left + right) / 2;
        while (left <= right) {
            // 判断下标为 mid 的元素是否为峰值,其中注意越界
            if ((mid == 0 || nums[mid - 1] < nums[mid]) &&
                    (mid == len - 1 || nums[mid + 1] < nums[mid])) {
                break;
            }
            if (nums[mid] > nums[mid + 1]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
            mid = (left + right) / 2;
        }
        return mid;
    }
}